package com.generic.mixed.type.demo2;

/**
 * 这里使用Decorator的目的是为了达到让我们最外层的持有对象，例如 Extend2 同时拥有 Extend1， Base
 * 的功能，与连续的继承不同的是，Decorator模式并不是一个继承链，而是一个持有链， 可以想想成 Extend2 持有 Extend1 ，
 * Extend1 持有 Base，这样的好处是更为灵活，我们可以自由的调换持有顺序。
 * 其缺陷在于我们可以在Extend1和Extend2内部操作他们的持有对象，但是客户端对整个持有链的操作被窄化成了最外层引用，例如实例代码里就是我们只能拿到
 * Extend2 的引用，却无法获取 Extend2 -> Extend1 -> Base 。 原因是 Extend2 里持有的 Extend1
 * 的引用存在与Decorator类里，它是 Base 类型的，而非具体的Extend1，2，3，4型。
 * 
 * @author Administrator
 *
 */
public class Demo {

	public static void main(String[] args) {
		Base base = new Base();
		Extend1 extend1 = new Extend1();
		Extend2 extend2 = new Extend2();
		extend1.set(base);
		extend2.set(extend1);
		extend2.operation();
		System.out.println();
		extend1.operation();
		System.out.println();
		base.operation();
		System.out.println();
		extend2.set(base);
		extend1.set(extend2);
		extend1.operation();
	}

}
